<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Support\Facades\Request;
use Throwable;


class RequestFailException extends Exception
{
    /**
     * 異常攜帶的相關的信息
     * @var array
     */
    public $bindData = [];

    /**
     * 报告异常
     *
     * @return void
     */
    public function report()
    {
        //
    }

    /**
     * 将异常渲染到 HTTP 响应中。
     *
     * @param  \Illuminate\Http\Request
     * @return void
     */
    public function render($request)
    {
        $errMes = $this->getMessage() ?? '验证失败';

        # 根据不同的请求 相应不同的数据
        $proRequestMode = config('prorequest.mode');

        # api 请求
        if ($proRequestMode === 'api') {
            $mesInfo = array_flatten($this->bindData);
            $mesInfo = count($mesInfo) > 0 ? array_shift($mesInfo) : $errMes;
            return response()->json(verify_err($this->bindData, $mesInfo));
        }

        # web 方式请求
        if ($proRequestMode === 'web') {
            # 请求参数 和错误信息刷入临时session
            if (Request::all())
                Request::session()->flashInput(Request::all());
            if ($this->bindData)
                session()->flash('last_err', $this->bindData);

            # 错误信息
            if (isset($this->bindData['msg'])) {
                $mesInfo = $this->bindData['msg'];
            } else {
                $mesInfo = array_flatten($this->bindData);
                $mesInfo = count($mesInfo) > 0 ? array_shift($mesInfo) : $errMes;
            }

            # 后台跳转页
            if (Request::is('admin/*'))
                return view(config('tapp.default_admin_jump'), ['jump_data' => verify_err($this->bindData, $mesInfo)]);

            # 前台跳转页
            echo '处理前台跳转';die;

        }
    }

    /**
     * 设置当前异常的數據信息
     * @param $data
     * @return RequestFailException
     */
    public function setBindData($data = []) {
        $this->bindData = $data;
        return $this;
    }
}
